﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DataTier.Repository;
using System.ServiceModel;
using DataTier.Entities;
using DataTier;
using Common;

namespace Otgruzka.ServicesClients
{
    public class DictionariesClient
    {

        public readonly DictionariesRepository Repository = null;

        public DictionariesClient()
        {
            this.Repository = new DictionariesRepository();
        }


        /// <summary>
        /// Возвращает полный текст Exceptions вместе с вложенными Exceptions
        /// </summary>
        /// <param name="ex"></param>
        /// <returns></returns>
        public string GetExceptionDetail(System.ServiceModel.FaultException<ExceptionDetail> ex)
        {                                
            string message = ex.Message;

            var ie = ex.InnerException;
            while (ie != null)
            {
                message += string.Format("<br />{0}", ie.Message);
                ie = ie.InnerException;
            }

            var ed = ex.Detail;
            do
            {
                message += string.Format("<br />{0}", ed.Message);
                ed = ed.InnerException;
            } while (ed != null);
            return message;
        }


        /// <summary>
        /// Возвращает список центров затрат
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <returns></returns>
        public List<CostsCenterEntity> GetCostsCenterList(int currentUserId)
        {
            try
            {
                var list = Repository.GetCostsCenterList(currentUserId);
                return list;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список Центров затрат из базы данных.");
            }
        }


        /// <summary>
        /// Возвращается список Центров затрат со связанной с ними информацией о пользователе и правах доступа
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <returns></returns>
        public List<CostsCenterFullInfoEntity> GetCostsCenterFullInfoList(int currentUserId)
        {
            try
            {
                var list = Repository.GetCostsCenterFullInfoList(currentUserId);
                return list;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список Центров затрат из базы данных.");
            }
        }


        /// <summary>
        /// Возвращается Центр затрат со связанной с ними информацией о пользователе и правах доступа
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <returns></returns>
        public CostsCenterFullInfoEntity GetCostsCenterFullInfo(int currentUserId, int CostsCenterId)
        {
            try
            {
                var center = Repository.GetCostsCenterFullInfo(currentUserId, CostsCenterId);
                return center;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить Центр затрат из базы данных.");
            }
        }


        /// <summary>
        /// Возвращается Центр затрат со связанной с ними информацией о пользователе и правах доступа
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <returns></returns>
        public CostsCenterFullInfoEntity GetCostsCenterFullInfoByUserId(int currentUserId, int UserId)
        {
            try
            {
                var center = Repository.GetCostsCenterFullInfoByUserId(currentUserId, UserId);
                return center;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить Центр затрат из базы данных.");
            }
        }


        /// <summary>
        /// Сохранение Центра затрат и информации о пользователе и его правах
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="juridicalPerson"></param>
        /// <returns></returns>
        public int SaveCostsCenterFullInfoEntity(int currentUserId, CostsCenterFullInfoEntity center)
        {
            try
            {
                int id = Repository.SaveCostsCenterFullInfoEntity(currentUserId, center);
                return id;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке сохранить Центр затрат в базе данных.");
            }
        }


        /// <summary>
        /// Возвращает список отделов
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <returns></returns>
        public List<DepartmentEntity> GetDepartmentList(int currentUserId)
        {
            try
            {
                var list = Repository.GetDepartmentList(currentUserId);
                return list;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список Отделов из базы данных.");
            }
        }


        /// <summary>
        /// Сохранение Отдела
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="department"></param>
        /// <returns></returns>
        public int SaveDepartment(int currentUserId, DepartmentEntity department)
        {
            try
            {
                int id = Repository.SaveDepartment(currentUserId, department);
                return id;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке сохранить Отдел в базе данных.");
            }
        }


        /// <summary>
        /// Возвращает список Юридических лиц
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <returns></returns>
        public List<JuridicalPersonEntity> GetJuridicalPersonList(int currentUserId)
        {
            try
            {
                var list = Repository.GetJuridicalPersonList(currentUserId);
                return list;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список Юридических лиц из базы данных.");
            }
        }


        /// <summary>
        /// Сохранение Юридического лица
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="juridicalPerson"></param>
        /// <returns></returns>
        public int SaveJuridicalPerson(int currentUserId, JuridicalPersonEntity juridicalPerson)
        {
            try
            {
                int id = Repository.SaveJuridicalPerson(currentUserId, juridicalPerson);
                return id;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке сохранить Юридическое лицо в базе данных.");
            }
        }


        /// <summary>
        /// Возвращает список Компаний
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <returns></returns>
        public List<Company> GetCompanyList(int currentUserId)
        {
            try
            {
                var list = Repository.GetCompanyList(currentUserId);
                return list;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список Компаний из базы данных.");
            }
        }


        /// <summary>
        /// Удаление Центра затрат
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="CostsCenterId"></param>
        public void DeleteCostsCenter(int currentUserId, int CostsCenterId)
        {
            try
            {
                Repository.DeleteCostsCenter(currentUserId, CostsCenterId);
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке удалить Центр затрат из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает список Ролей
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <returns></returns>
        public List<RoleEntity> GetRoleEntityList(int currentUserId)
        {
            try
            {
                var list = Repository.GetRoleEntityList(currentUserId);
                return list;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список Ролей из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает список Ролей
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <returns></returns>
        public List<Role> GetRoleList(int currentUserId)
        {
            try
            {
                var list = Repository.GetRoleList(currentUserId);
                return list;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список Ролей из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает Роль
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="roleId"></param>
        /// <returns></returns>
        public RoleEntity GetRoleEntity(int currentUserId, int roleId)
        {
            try
            {
                var role = Repository.GetRoleEntity(currentUserId, roleId);
                return role;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить Роль из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает список пунктов Меню
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <returns></returns>
        public List<Menu> GetMenuList(int currentUserId)
        {
            try
            {
                var list = Repository.GetMenuList(currentUserId);
                return list;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список пунктов Меню из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает список Статусов документов
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <returns></returns>
        public List<State> GetStateList(int currentUserId)
        {
            try
            {
                var list = Repository.GetStateList(currentUserId);
                return list;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список Статусов документов из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает список Страниц системы
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <returns></returns>
        public List<WebPage> GetWebPageList(int currentUserId)
        {
            try
            {
                var list = Repository.GetWebPageList(currentUserId);
                return list;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список Страниц системы из базы данных.");
            }
        }


        /// <summary>
        /// Возвращает список Страниц системы
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <returns></returns>
        public List<WebPage> GetWebPageASPXList(int currentUserId)
        {
            try
            {
                var list = this.Repository.GetWebPageList(currentUserId);
                return (list != null) ? list.Where(w => w.Name != null && w.Name.ToLower().Contains(".aspx")).ToList() : null;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке получить список Страниц системы из базы данных.");
            }
        }


        /// <summary>
        /// Сохранение Роли со всеми правами доступа
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="role"></param>
        /// <returns></returns>
        public int SaveRoleEntity(int currentUserId, RoleEntity role)
        {
            try
            {
                int id = Repository.SaveRoleEntity(currentUserId, role);
                return id;
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке сохранить Роль в базе данных.");
            }
        }


        /// <summary>
        /// Удаление Роли
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="RoleId"></param>
        public void DeleteRole(int currentUserId, int RoleId)
        {
            try
            {
                Repository.DeleteRole(currentUserId, RoleId);
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке удалить Роль из базы данных.");
            }
        }


        /// <summary>
        /// Удаление Юридического лица
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="juridicalPersonId"></param>
        public void DeleteJuridicalPerson(int currentUserId, int juridicalPersonId)
        {
            try
            {
                Repository.DeleteJuridicalPerson(currentUserId, juridicalPersonId);
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке удалить Юридическое лицо из базы данных.");
            }
        }


        /// <summary>
        /// Удаление Отдела
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="departmentId"></param>
        public void DeleteDepartment(int currentUserId, int departmentId)
        {
            try
            {
                Repository.DeleteDepartment(currentUserId, departmentId);
            }
            catch (Exception ex)
            {
                new Logger().LogException(ex);
                throw new FaultException<ExceptionDetail>(new ExceptionDetail(ex), "Произошла ошибка при попытке удалить Отдел из базы данных.");
            }
        }



    }
}